
//
//  main.c
//  zhan
//
//  Created by mac on 16/4/17.
//  Copyright © 2016年 廖梦诗. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
//栈的类型定义
typedef  struct sstack{
    int * top;//  栈顶指针
    int * bottom;//栈底指针
    int stacksize;//栈已经分配的空间的大小
    
    
}Sstack;

//栈的初始化，将栈返回
Sstack init_stack(void){
    
    Sstack s;
    
    //给栈底分配空间
    s.bottom=(int*)malloc(40*sizeof(int));
    
    //如果分配空间失败，提示并退出
    if(!s.bottom){
        
        printf("内存分配失败!\n");
        exit(0);
        
    }
    //如果栈底分配成功，就要将栈置空
    s.top = s.bottom;
    
    //设置栈的当前空间大小
    s.stacksize=40;
    return s;
    
}

//入栈（压栈，进栈）操作
void push(Sstack s,int e){
    //判断栈是否已经满了，如果满栈，需要增加存储空间
    if(s.top - s.bottom >= s.stacksize){
        //满栈需要重新分配空间
        s.bottom=(int *)malloc((s.stacksize+1) * sizeof(int));
        //如果分配失败，提示并退出
        if(!s.bottom){
            printf("内存不足，分配空间失败\n");
            exit(0);
            
            
        }else{
            
            s.top=s.bottom+s.stacksize;
            //将空间＋1
            s.stacksize ++;
            
            
        }
        
    }
    
    //将e设置成栈顶元素的值
    *s.top=e;
    s.top ++;
}

//出栈（弹栈）操作
int pop(Sstack s){
    
    //判断栈里面有没有元素可以弹出，是否是空栈
    if(s.top==s.bottom){
        printf("该栈为空，不允许操作！\n");
        exit(0);
        
    }
    //将栈顶指针－1
    s.top--;
    //将栈顶元素返回
    return *s.top;
}
int main(int argc, const char * argv[])
{
    //创建栈
    Sstack s=init_stack();
    //入栈
    push(s,67);
    push(s,85);
    pop(s);
    return 0;
}



